package com.efast.dmom.mes.service.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.efast.dmom.mes.bean.ResultBean;
import com.efast.dmom.mes.bean.Shift;
import com.efast.dmom.mes.bean.ShiftItem;
import com.efast.dmom.mes.bean.base.ShiftItemType;
import com.efast.dmom.mes.datahandlers.entity.ShiftDataHandler;
import com.efast.dmom.mes.datahandlers.entity.ShiftItemDataHandler;
import com.efast.dmom.mes.service.ShiftItemService;

@Service
public class ShiftItemServiceImpl implements ShiftItemService {
	@Autowired
	private ShiftItemDataHandler shiftItemDataHandler;
	@Autowired
	private ShiftDataHandler shiftDataHandler;

	// 新增
	@Override
	public ResultBean save(ShiftItem shiftItem) {
		ResultBean result = new ResultBean(true, "'");
		Shift shift = shiftDataHandler.getById(shiftItem.getInnerData().getShiftId());
		// 获得是否跨天值 0,不跨天 1跨天
		int timeCheck = shift.getInnerData().getDaySpan();
		// 如果班次不跨天
		if (timeCheck == 0) {
			// 对新增内容进行必填校验
			if (shiftItem.getInnerData().getStartTime() != null && shiftItem.getInnerData().getEndTime() != null
					&& shiftItem.getInnerData().getShiftItemType() != null&& ShiftItemType.getCode(shiftItem.getInnerData().getShiftItemType())>0) {
				// 获取项的开始结束时间分钟差值
				long itemSpace = itemTimeCompare(shiftItem.getInnerData().getEndTime(), shiftItem.getInnerData().getStartTime());
				// 获取项的开始时间与班次开始时间的差值
				long itemZoneSeq = itemTimeCompare(shiftItem.getInnerData().getStartTime(), shift.getInnerData().getStartTime());
				// 校验开始时间和结束时间大小
				int compareTimeNumber1 = shiftItem.getInnerData().getEndTime().compareTo(shiftItem.getInnerData().getStartTime());
				// 项开始时间与班次开始时间比较
				int compareTimeNUmber2 = shiftItem.getInnerData().getStartTime().compareTo(shift.getInnerData().getStartTime());
				// 项结束时间与班次时间比较
				int compareTimeNUmber3 = shiftItem.getInnerData().getEndTime().compareTo(shift.getInnerData().getEndTime());
				// 调用方法，判断班次项开始、结束时间是否重叠
				boolean compareBool = checkCount(shiftItem);
				// if判断校验
				if (compareTimeNumber1 > 0 && compareTimeNUmber2 >= 0 && compareTimeNUmber3 <= 0
						&& compareBool == true) {
					
					shiftItem.getInnerData().setShiftItemSequence((int)itemZoneSeq);
					shiftItem.getInnerData().setDuration((int)itemSpace);
					shiftItemDataHandler.save(shiftItem);
					result.setSuccess(true);
					result.setMessage("新增成功！");
				} else {
					result.setSuccess(false);
					result.setMessage("非跨天：开始时间或者结束时间不符合要求，请重填！");
					return result;
				}
			} else {
				result.setSuccess(false);
				result.setMessage("请检查开始时间、结束时间、休息类型、休息顺序是否填写！");
				return result;
			}
		} // 否则班次是跨天的情况下
		else {
			// 对新增内容进行必填校验
			if (shiftItem.getInnerData().getStartTime() != null && shiftItem.getInnerData().getEndTime() != null
					&& shiftItem.getInnerData().getShiftItemType() != null) {
				// 获取项的开始时间与班次开始时间的差值
				long itemSpanZoneSeq = itemTimeCompare(shiftItem.getInnerData().getStartTime(), shift.getInnerData().getStartTime());
				// 获取开始结束时间分钟差值
				long itemSpacedaySpan = itemTimeCompare(shiftItem.getInnerData().getEndTime(), shiftItem.getInnerData().getStartTime());
				// 项开始时间和项结束时间大小
				int itemEndCompareItemStart = shiftItem.getInnerData().getEndTime().compareTo(shiftItem.getInnerData().getStartTime());
				// 项开始时间与班次开始时间比较
				int itemStartCompareShiftStart = shiftItem.getInnerData().getStartTime().compareTo(shift.getInnerData().getStartTime());
				// 项结束时间与班次开始时间比较
				int itemEndCompareShiftStart = shiftItem.getInnerData().getEndTime().compareTo(shift.getInnerData().getStartTime());
				// 项结束时间与班次结束时间比较
				int itemEndCompareShiftEnd = shiftItem.getInnerData().getEndTime().compareTo(shift.getInnerData().getEndTime());
				// 调用方法，项之间的比较
				boolean compareBool = daySpanCheckCount(shiftItem);
				// 项没跨天的情况下(当班次项的开始时间 小于 班次项的结束时间)：需要满足以下校验：
				boolean checkBoolNoSpan = (itemEndCompareItemStart > 0) && (compareBool)
						&& (((itemStartCompareShiftStart >= 0) && (itemEndCompareShiftStart > 0))
								|| ((itemStartCompareShiftStart <= 0) && (itemEndCompareShiftEnd <= 0)));
				// 项处于跨天的情况下(当班次项的开始时间 大于 班次项的结束时间)：需要满足以下校验：
				boolean checkBoolSpan = (itemEndCompareItemStart < 0) && (compareBool)
						&& ((itemStartCompareShiftStart >= 0) && (itemEndCompareShiftEnd <= 0));
				// if判断校验

				if (checkBoolNoSpan || checkBoolSpan) {
					shiftItem.getInnerData().setShiftItemSequence((int)itemSpanZoneSeq);
					shiftItem.getInnerData().setDuration((int)itemSpacedaySpan);
					shiftItemDataHandler.save(shiftItem);
					result.setSuccess(true);
					result.setMessage("新增成功！");
				} else {
					result.setSuccess(false);
					result.setMessage("跨天：开始时间或者结束时间不符合要求，请重填！");
					return result;
				}
			} else {
				result.setSuccess(false);
				result.setMessage("请检查开始时间、结束时间、休息类型是否填写！");
				return result;
			}
		}
		return result;
	}

	// 删除
	@Override
	public ResultBean delete(ShiftItem shiftItem) {
		ResultBean result = new ResultBean(true, "'");
		shiftItemDataHandler.delete(shiftItem);
		result.setSuccess(true);
		result.setMessage("删除成功！");
		return result;
	}

//修改
	@Override
	public ResultBean update(ShiftItem shiftItem) {
		ResultBean result = new ResultBean(true, "'");
		Shift shift = shiftDataHandler.getById(shiftItem.getInnerData().getShiftId());
		// 获得是否跨天值 0, 1不跨天 -1跨天
		int timeCheck = shift.getInnerData().getDaySpan();
		// 如果班次不跨天
		if (timeCheck >= 0) {
			// 对新增内容进行必填校验
			if (shiftItem.getInnerData().getStartTime() != null && shiftItem.getInnerData().getEndTime() != null
					&& shiftItem.getInnerData().getShiftItemType() != null) {
				// 获取项的开始结束时间分钟差值
				long itemSpace = itemTimeCompare(shiftItem.getInnerData().getEndTime(), shiftItem.getInnerData().getStartTime());
				// 获取项的开始时间与班次开始时间的差值
				long itemZoneSeq = itemTimeCompare(shiftItem.getInnerData().getStartTime(), shift.getInnerData().getStartTime());
				// 校验开始时间和结束时间大小
				int compareTimeNumber1 = shiftItem.getInnerData().getEndTime().compareTo(shiftItem.getInnerData().getStartTime());
				// 项开始时间与班次开始时间比较
				int compareTimeNUmber2 = shiftItem.getInnerData().getStartTime().compareTo(shift.getInnerData().getStartTime());
				// 项结束时间与班次时间比较
				int compareTimeNUmber3 = shiftItem.getInnerData().getEndTime().compareTo(shift.getInnerData().getEndTime());
				// 调用方法，判断班次项开始、结束时间是否重叠
				boolean compareBool = checkCount(shiftItem);
				// if判断校验
				if (compareTimeNumber1 > 0 && compareTimeNUmber2 >= 0 && compareTimeNUmber3 <= 0
						&& compareBool == true) {
					
					shiftItem.getInnerData().setShiftItemSequence((int)itemZoneSeq);
					shiftItem.getInnerData().setDuration((int)itemSpace);
					shiftItemDataHandler.update(shiftItem);
					result.setSuccess(true);
					result.setMessage("修改成功！");
				} else {
					result.setSuccess(false);
					result.setMessage("非跨天：开始时间或者结束时间不符合要求，请重填！");
					return result;
				}
			} else {
				result.setSuccess(false);
				result.setMessage("请检查开始时间、结束时间、休息类型、休息顺序是否填写！");
				return result;
			}
		} // 否则班次是跨天的情况下
		else {
			// 对新增内容进行必填校验
			if (shiftItem.getInnerData().getStartTime() != null && shiftItem.getInnerData().getEndTime() != null
					&& shiftItem.getInnerData().getShiftItemType() != null) {
				// 获取项的开始时间与班次开始时间的差值
				long itemSpanZoneSeq = itemTimeCompare(shiftItem.getInnerData().getStartTime(), shift.getInnerData().getStartTime());
				// 获取开始结束时间分钟差值
				long itemSpacedaySpan = itemTimeCompare(shiftItem.getInnerData().getEndTime(), shiftItem.getInnerData().getStartTime());
				// 项开始时间和项结束时间大小
				int itemEndCompareItemStart = shiftItem.getInnerData().getEndTime().compareTo(shiftItem.getInnerData().getStartTime());
				// 项开始时间与班次开始时间比较
				int itemStartCompareShiftStart = shiftItem.getInnerData().getStartTime().compareTo(shift.getInnerData().getStartTime());
				// 项结束时间与班次开始时间比较
				int itemEndCompareShiftStart = shiftItem.getInnerData().getEndTime().compareTo(shift.getInnerData().getStartTime());
				// 项结束时间与班次结束时间比较
				int itemEndCompareShiftEnd = shiftItem.getInnerData().getEndTime().compareTo(shift.getInnerData().getEndTime());
				// 调用方法，项之间的比较
				boolean compareBool = daySpanCheckCount(shiftItem);
				// 项没跨天的情况下(当班次项的开始时间 小于 班次项的结束时间)：需要满足以下校验：
				boolean checkBoolNoSpan = (itemEndCompareItemStart > 0) && (compareBool)
						&& (((itemStartCompareShiftStart >= 0) && (itemEndCompareShiftStart > 0))
								|| ((itemStartCompareShiftStart <= 0) && (itemEndCompareShiftEnd <= 0)));
				// 项处于跨天的情况下(当班次项的开始时间 大于 班次项的结束时间)：需要满足以下校验：
				boolean checkBoolSpan = (itemEndCompareItemStart < 0) && (compareBool)
						&& ((itemStartCompareShiftStart >= 0) && (itemEndCompareShiftEnd <= 0));
				// if判断校验

				if (checkBoolNoSpan || checkBoolSpan) {
					shiftItem.getInnerData().setShiftItemSequence((int)itemSpanZoneSeq);
					shiftItem.getInnerData().setDuration((int)itemSpacedaySpan);
					shiftItemDataHandler.update(shiftItem);
					result.setSuccess(true);
					result.setMessage("修改成功！");
				} else {
					result.setSuccess(false);
					result.setMessage("跨天：开始时间或者结束时间不符合要求，请重填修改！");
					return result;
				}
			} else {
				result.setSuccess(false);
				result.setMessage("请检查开始时间、结束时间、休息类型是否填写！");
				return result;
			}
		}
		return result;
	}

//通过shift1id查看它下面的所有班次项信息
	@Override
	public List<ShiftItem> getShiftItemByShiftId(long shiftId) {
		return shiftItemDataHandler.getShiftItemByShiftId(shiftId);
	}

//通过shiftItemId查看某个班次项信息
	@Override
	public ShiftItem getById(long shiftItemId) {
		return shiftItemDataHandler.getById(shiftItemId);
	}

	// 非跨天模式：班次项开始、结束时间与其它班次项比较 ,时间区间不能重叠
	public boolean checkCount(ShiftItem shiftItem) {
		LocalTime time1 = shiftItem.getInnerData().getStartTime();
		// LocalTime time2 = shiftItem.getEndTime();
		List<ShiftItem> listItem = shiftItemDataHandler.getShiftItemByShiftId(shiftItem.getInnerData().getShiftId());
		
		if (listItem != null && listItem.size() > 0) {
			for (int i = 0; i < listItem.size(); i++) {

				int compare1 = time1.compareTo(listItem.get(i).getInnerData().getStartTime());
				int compare2 = time1.compareTo(listItem.get(i).getInnerData().getEndTime());
				if (!(compare1 > 0 && compare2 >= 0) && !(compare1 < 0 && compare2 < 0)&&!((shiftItem.getInnerData().getId()==listItem.get(i).getInnerData().getId()))) {
					return false;
				}
			}

		} else {

			return true;
		}
		return true;

	}

//对班次项内进行遍历，查看是否已有跨天班次项
	public ShiftItem checkItemTime(ShiftItem shiftItem) {
		List<ShiftItem> listCheckItem = shiftItemDataHandler.getShiftItemByShiftId(shiftItem.getInnerData().getShiftId());
		if (listCheckItem != null && listCheckItem.size() > 0) {
			for (int j = 0; j < listCheckItem.size(); j++) {
				// 判断项里是否已有跨天项
				int compareItemStartEnd = (listCheckItem.get(j).getInnerData().getEndTime())
						.compareTo(listCheckItem.get(j).getInnerData().getStartTime());
				if (compareItemStartEnd < 0) {
					return listCheckItem.get(j);
				}

			}
		}
		return null;

	}

	// 跨天模式：
	public boolean daySpanCheckCount(ShiftItem shiftItem) {
		Shift shift = shiftDataHandler.getById(shiftItem.getInnerData().getShiftId());
		List<ShiftItem> listItemSpan = shiftItemDataHandler.getShiftItemByShiftId(shiftItem.getInnerData().getShiftId());
		int compareNumber = shiftItem.getInnerData().getEndTime().compareTo(shiftItem.getInnerData().getStartTime());
		ShiftItem shiftSpanItem = checkItemTime(shiftItem);
		if (compareNumber > 0) {
			if (shiftSpanItem == null) {
				if (listItemSpan != null && listItemSpan.size() > 0) {
					for (int i = 0; i < listItemSpan.size(); i++) {
						// 班次项的开始时间大于其他班次项的开始时间，那么也大于结束时间
						boolean compareNoSpan1 = (shiftItem.getInnerData().getStartTime()
								.compareTo(listItemSpan.get(i).getInnerData().getStartTime()) > 0)
								&& (shiftItem.getInnerData().getStartTime().compareTo(listItemSpan.get(i).getInnerData().getEndTime()) > 0);
						// 如果班次项的开始时间小于其他班次项的开始时间，那么也小于结束时间
						boolean compareNoSpan2 = (shiftItem.getInnerData().getStartTime()
								.compareTo(listItemSpan.get(i).getInnerData().getStartTime()) < 0)
								&& (shiftItem.getInnerData().getStartTime().compareTo(listItemSpan.get(i).getInnerData().getEndTime()) < 0);
						if (!(compareNoSpan1 || compareNoSpan2)) {
							return false;
						}
					}
				}
				return true;
			} else {
				for (int i = 0; i < listItemSpan.size(); i++) {
					// 如果已存在跨天项，则应满足(新增项的开始时间小于跨天项的开始时间且结束时间大于其结束时间)&&(新增项的结束时间大于开始时间）//有且只有一个跨天项
					boolean compareSpan3 = ((shiftItem.getInnerData().getEndTime().compareTo(shiftSpanItem.getInnerData().getStartTime()) <= 0)
							&& (shiftItem.getInnerData().getStartTime().compareTo(shiftSpanItem.getInnerData().getEndTime()) >= 0))
							&& (shiftItem.getInnerData().getEndTime().compareTo(shiftItem.getInnerData().getStartTime()) > 0);
					if (!compareSpan3) {
						return false;
					}
				}
			}
			return true;
		} // 添加跨天项
		else {
			if (listItemSpan != null && listItemSpan.size() > 0) {
				if (shiftSpanItem != null) {
					return false;
				}
				for (int i = 0; i < listItemSpan.size(); i++) {
					// 班次项的开始时间大于所有班次项的开始时间，该班次项跨天，开始时间最大
					// 班次项的结束时间小于其他班次项（其他班次项的开始时间小于该班次的开始时间）的开始时间，小于班次的结束时间
					boolean compareSpan = (shiftItem.getInnerData().getStartTime().compareTo(listItemSpan.get(i).getInnerData().getStartTime()) > 0)
							&& (shiftItem.getInnerData().getEndTime().compareTo(listItemSpan.get(i).getInnerData().getStartTime()) < 0)
							&& (shiftItem.getInnerData().getEndTime().compareTo(shift.getInnerData().getEndTime()) < 0);
					if (compareSpan == false) {
						return false;
					}
				}
			}

			return true;
		}
	}

	// 比较开始时间与结束时间大小判断
	public long itemTimeCompare(LocalTime localTime1, LocalTime localTime2) {
		// SimpleDateFormat dateFormat = new SimpleDateFormat("HH-mm");
		// String Time1=dateFormat.format(localTime1);
		// String Time2=dateFormat.format(localTime2);
		int hour1 = localTime1.getHour();
		int minute1 = localTime1.getMinute();
		int hour2 = localTime2.getHour();
		int minute2 = localTime2.getMinute();
		String time1 = hour1 + ":" + minute1;
		String time2 = hour2 + ":" + minute2;

		SimpleDateFormat format = new SimpleDateFormat("HH:mm");
		Date date1 = null;
		Date date2 = null;
		long minutes = 0;
		try {
			date1 = format.parse(time1);
			date2 = format.parse(time2);
			long countTime = date1.getTime() - date2.getTime();
			minutes = countTime / (1000 * 60);
			if (minutes < 0) {
				minutes = minutes + 1440;
			}
		} catch (ParseException e) {
			e.printStackTrace();

		}
		return minutes;

	}


}
